/*
 * Proyecto fin de master. Servicio de alertas 112
 * Jorge Tarancon Iglesias
 * Master en desarrollo de aplicaciones para Internet y Moviles
 */
package es.us.mwm.backBean;

import es.us.mwm.backBean.util.JsfUtil;
import es.us.mwm.entities.Users;
import es.us.mwm.sessionBean.UserEJBLocal;
import java.io.Serializable;
import java.util.Date;
import java.util.List;
import javax.annotation.PreDestroy;
import javax.ejb.EJB;
import javax.faces.bean.ManagedBean;
import javax.faces.bean.SessionScoped;
import javax.faces.context.FacesContext;
import javax.servlet.http.HttpSession;

/**
 * Clase para la gestion del login Recoge y comprueba que los datos de acceso sean correctos, inicializa sesion y
 * redirecciona
 *
 * @author y0rg
 */
@SessionScoped
@ManagedBean(name = "login")
public class LoginManager implements Serializable {

    @EJB
    private UserEJBLocal userFacade;
    private Users user;
    private List<Users> userList;
    private FacesContext context;
    
    private HttpSession session;

    /**
     * Creates a new instance of LoginManagedBean
     */
    public LoginManager() {
        user = new Users();
        context = FacesContext.getCurrentInstance();
        session = (HttpSession) context.getExternalContext().getSession(true);
    }

    /**
     *
     * @param userList
     */
    public void setUserList(List<Users> userList) {
        this.userList = userList;
    }

    /**
     *
     * @return
     */
    public List<Users> getUserList() {
        return userFacade.getUsersFindAll();
    }

    /**
     * Metodo para el login en el sistema. Crea la sesion y almacena el usuario y el tipo, actualiza el estado de la base de
     * datos y la fecha Si no existe devuelve error y muestra el mensaje de error en los datos de acceso
     *
     * @return
     */
    public String login() {

        String s = userFacade.checkLogin(user.getUser(), user.getPassword());
        if (s.equals("ERROR")) { //Si no encuentra el usuario con los datos pasados
            //Muestro mensaje de error
            JsfUtil.addErrorMessage("Error en los datos de acceso");
        } else {
            //Si existe el usuario
            session.setAttribute("user", user.getUser());
            session.setAttribute("admin", s);
            //TODO
            //Se puede mejorar, estoy consultando dos veces la base de datos.
            user = userFacade.getUser(user.getUser());
            user.setLastConnection(new Date());
            user.setStatus("Connected");
            userFacade.mergeUsers(user);

        }
        return s;
    }

    /**
     * Metodo para salir de la aplicacion. Logout
     *
     * @return LOGOUT para redireccionar
     */
    public String logout() {
        //Actualizo los datos del usuario actual
        user.setLastConnection(new Date());
        user.setStatus("Active");
        //Lo guardo en la base de datos
        userFacade.mergeUsers(user);
        //Invalidamos la sesion
        session.invalidate();
        return "LOGOUT";
    }

    /**
     * Metodo que se ejecuta antes de que expire la sesion, actualizando los datos del usuario en la base de datos
     */
    @PreDestroy
    public void destroy() {
        //Actualizo los datos del usuario actual
        if (user.getUser() != null) {
            user.setLastConnection(new Date());
            user.setStatus("Active");
            //Lo guardo en la base de datos
            userFacade.mergeUsers(user);
        }
    }

    /**
     * Metodo de acceso para el atributo
     *
     * @param user usuario
     */
    public void setUser(Users user) {
        this.user = user;
    }

    /**
     * Metodo de acceso para el atributo
     *
     * @return usuario
     */
    public Users getUser() {
        return user;
    }

    /**
     * Metodo para editar los datos del usuario
     *
     * @return
     */
    public String edit() {
        userFacade.mergeUsers(user);
        JsfUtil.addSuccessMessage("Datos modificados correctamente");
        return "EDIT";
    }
}
